package com.huyi.web.service.impl;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;

import com.huyi.common.exception.BizException;
import com.huyi.web.service.RetryService;

@Service
public class RetryServiceImpl implements RetryService {

	private final Logger logger = LoggerFactory.getLogger(this.getClass());
	
	/**
	 * value：指定处理的异常类
	 * include：指定处理的异常类和value一样，默认为空，当exclude也为空时，默认所有异常
	 * exclude：指定异常不处理，默认空，当include也为空时，默认所有异常
	 * maxAttempts：最大重试次数。默认3次
	 * backoff： 重试等待策略。默认使用@Backoff注解
	 * @throws Exception 
	 * @Backoff 重试等待策略
	 * 	  backoff = @Backoff(delay = 5000l,multiplier = 2)
	 *    不设置参数时，默认使用FixedBackOffPolicy（指定等待时间），重试等待1000ms
	 *    设置delay,使用FixedBackOffPolicy（指定等待时间），重试等待填写的时间
	 *    设置delay和maxDealy时，重试等待在这两个值之间均态分布
	 * 	  设置delay、maxDealy、multiplier，使用 ExponentialBackOffPolicy（指数级重试间隔的实现 ）
	 *   multiplier即指定延迟倍数，比如delay=5000l,multiplier=2,则第一次重试为5秒，第二次为10秒，第三次为20秒……
	 * 
	 * 
	 */
	@Override
	@Retryable(value = {BizException.class}, maxAttempts = 3, backoff = @Backoff(delay = 5000l,multiplier = 1))
	public void call(String str) throws Exception {
		logger.info("TODO...,str={}", str);
		if("aaa".equals(str)) {
			throw new BizException("业务调用异常");
		}
		
	}

}
